import multiprocessing
import time
import os

"""
join()是否等待子进程执行结束，或等待多少秒
terminate()不管任务是否完成，立即终止子进程
current_process = multiprocessing.current_process() # 查看当前进程
current_process.pid, os.getpid()  # 获取当前进程编号
os.getppid()  # 获取父进程编号

queue
- Queue.qsize()：返回当前队列包含的消息数量；
- Queue.empty()：如果队列为空，返回True，反之False , 注意这个操作是不可靠的。
- Queue.full()：如果队列满了，返回True,反之False；
- Queue.get([block[, timeout]])：获取队列中的一条消息，然后将其从列队中移除，block默认值为True；
- Queue.put() :添加

进程池
1.multiprocessing.Pool(3):创建进程池3个
2.apply:阻塞方式，同步执行任务  一个任务执行完成以后另外一个任务才能执行
3.apply_async:非阻塞方式，异步执行任务  任务执行不会等待，多个任务一起执行

- close()：关闭Pool，使其不再接受新的任务；
- terminate()：不管任务是否完成，立即终止；
- join()：主进程阻塞，等待子进程的退出， 必须在close或terminate之后使用；
"""


# 进程池:池子里面放的进程，进程池会根据任务执行情况自动创建进程，而且尽量少创建进程，合理利用进程池中的进程完成多任务
import multiprocessing
import time


# 拷贝任务
def work():
    print("复制中...", multiprocessing.current_process().pid)
    # 获取当前进程的守护状态
    # 提示：使用进程池创建的进程是守护主进程的状态，默认自己通过Process创建的进程是不是守住主进程的状态
    # print(multiprocessing.current_process().daemon)
    time.sleep(0.5)


if __name__ == '__main__':
    # 创建进程池
    # 3:进程池中进程的最大个数
    pool = multiprocessing.Pool(3)
    # 模拟大批量的任务，让进程池去执行
    for i in range(5):
        # 循环让进程池执行对应的work任务
        # 同步执行任务，一个任务执行完成以后另外一个任务才能执行
        # pool.apply(work)
        # 异步执行，任务执行不会等待，多个任务一起执行
        pool.apply_async(work)

    # 关闭进程池，意思告诉主进程以后不会有新的任务添加进来
    pool.close()
    # 主进程等待进程池执行完成以后程序再退出
    pool.join()

"""
复制中... 6260
复制中... 8972
复制中... 14320
复制中... 6260
复制中... 8972
"""

# if __name__ == '__main__':
#     # 创建消息队列, 3:表示队列中最大消息个数
#     queue = multiprocessing.Queue(3)
#     # 放入数据,任意数据类型
#     queue.put(1)
#     queue.put("hello")
#     queue.put([3, 5])
#
#     size = queue.qsize()  # 获取队列的个数
#     print(size)
#     value = queue.get()  # 获取数据
#     print(value)  # 1
#     value = queue.get()  # 获取数据
#     print(value)  #
#     value = queue.get()  # 获取数据
#     print(value)  #




# def work(count):
#     for i in range(count):
#         print("work",i)
#
# if __name__ == '__main__':
#     Work = multiprocessing.Process(target=work,args=(8,))
#     current_process = multiprocessing.current_process()
#     print(current_process)
#     Work.start()
#     print(current_process.pid)
#     print(os.getppid())
#     # Work.join()
#     Work.terminate()
#     print("我是主进程不想等子进程")